//创建节点的类
class Node{
    constructor(element){
        this.element = element;
        this.next = null;
    }
}
//创建单链表的类
class Linked{
    constructor(){
        this.count = 0; //记录下标 -*个数
        this.head = null;
    }
    //向链表结尾添加节点
    push(element){
        let node = new Node(element); // node =>  element : 'a'  next : null
        //判断链表是否为空
        if(this.head == null){
            this.head = node
        }else{
            //单链表已有数据this.head
            //第一个
            let current = this.head;
            //第二个指向为null 则跳出循环
            while(current.next != null){//不是最后一个元素
                //第二个
                current = current.next;
            }
            // 第一个指向  这个也就是成为第二个
            current.next = node;
        }
        this.count++
    }
    //删除指定未知的元素
    removeAt(index){
        if(index >= 0 && index <= this.count){
            //第一个
            let current = this.head;
            if(index === 0){
                this.head = current.next
            }else{
                let prev = this.getElementAt(index-1)
                let current = this.getElementAt(index)
                // let prev = current;//第一个（存储）
                // for(let i = 0 ; i < index ; i++){
                //     //从头开始
                //     prev = current;  //第一个        第二个
                //     current = current.next //第二个   第三个
                // }
                prev.next = current.next;
            }
            this.count--;
            //返回删除的节点
            return current.element
        }else{
            return undefined
        }
    }
    //查找指定的元素  循环迭代
    getElementAt(index){
        let current = this.head;
        for(let i = 0 ; i < index ; i++){
            current=current.next
        }
        return current
    }
    //插入指定位置
    insert(element,index){
        //边界的判断
        if(index == 0 && index < this.count){
            //创建节点
            let node = new Node(element)
            let current = this.head
            //是否再开头插入
            if(index === 0){
                node.next = current;
                this.head = node;
            }else{
                //插入中间位置
                //找到index位置next 指向原本本身 
                let prev = this.getElementAt(index-1);//前一个
                node.next = prev.next ;
                prev.next  = node;
            }
            this.count++;
        }else{
            return undefined
        }
    }
    //查找索引
    indexOf(element){
        let current = this.head;
        for(let i = 0 ; i < this.count ; i++){
            if(element === current.element){
                return i 
            }
            current=current.next;
        }
    }
    //删掉节点
    remove(element){
        //找下标
        let index = this.indexOf(element)
        //删除
        this.removeAt(index)
    }
    //获取链表的长度
    size(){
        return this.count
    }
    //链表是否为空
    isEmpty(){
        // if(this.count === 0){
        //     return true
        // }else{
        //     return false
        // }
        return this.count ? false : true
    }
    //获取首个节点
    getHead(){
        return this.head
    }
}
let link = new Linked();

link.push('a')
link.push('b')
link.push('c')

// console.log(link.removeAt(2))
console.log(link.indexOf('a'))

// link.insert('d',0)
link.insert('e',1)

console.log(link)